package com.sanploy.manage.service;

import com.sanploy.common.domain.Goods;
import com.sanploy.common.domain.dto.ReduceStockDto;
import com.sanploy.common.domain.dto.StockEditParamDto;
import com.sanploy.common.domain.vo.*;
import com.sanploy.common.vo.BaseException;

import java.util.List;

/**
 * Created by zhu yingzhi on 2017/9/6.
 * @author yingzhi zhu
 * 后台商品逻辑处理接口
 */
public interface GoodsService
{
    /**
     * 更新商品 信息
     * @param goods 商品
     * @param goodsAttrs_json 商品规格
     * @return 影响行数
     * @throws Exception 各种异常
     */
    public int updateGoods(Goods goods, String goodsAttrs_json) throws Exception;

    /**
     * 通过id获取商品
     * @param id 商品id
     * @return
     * @throws BaseException 各种异常
     */
    public GoodsDetailVo getGoodsById(Long id) throws BaseException;

    /**
     * 通过List id获取商品
     * @param idList 商品id
     * @return 商品列表
     * @throws BaseException 各种异常
     */
    public List<Goods> getGoodsByIdList(List<Long> idList) throws BaseException;

    /**
     * 删除商品
     * @param id 商品id
     * @return 影响行数
     * @throws Exception 各种异常
     */
    public int deleteGoods(Long id) throws Exception;

    /**
     * 插入商品
     * @param goods 商品
     * @param goodsAttrs_json 商品规格
     * @return 影响行数
     * @throws Exception 各种异常
     */
    public int insertGoods(Goods goods,
                           String goodsAttrs_json) throws Exception;

    /**
     * 分页获取商品信息
     * @param currentPage 当前页码
     * @param pageSize 大小
     * @param goodsSort 排序方法
     * @return 商品分页对象
     */
    public Page<GoodsListVo> getGoodsPage(int currentPage, int pageSize, GoodsSort goodsSort);

    /**
     * 更新 促销商品
     * @param promoteVo
     * @return 影响行数
     * @throws BaseException 各种异常
     */
    public int updatePromoteVo(PromoteVo promoteVo) throws BaseException;

    /**
     * 获取 促销商品
     * @param goods_id 商品id
     * @return PromoteVo对象
     */
    public PromoteVo getPromoteVo(Long goods_id);

    /**
     * 设置某商品上架
     * @param is_shelve 是否上架
     * @param goods_id 商品id
     * @return 影响行数
     * @throws BaseException 各种异常
     */
    public int setShelve(boolean is_shelve, Long goods_id) throws BaseException;

    /**
     * 通过名字搜索商品
     * @param name 名字
     * @return 搜索结果
     */
    public List<SearchResultVo> searchGoodsByName(String name);

    /**
     * 减少商品库存
     * @param reduceStockDto 库存对象
     */
    void reduceGoodsStock(ReduceStockDto reduceStockDto);

    /**
     * 恢复库存
     * @param reduceStockDto 库存对象
     */
    void restoreGoodsStock(ReduceStockDto reduceStockDto);

    /**
     * 修改商品库存
     * @param stockEditParam
     * @return 是否成功
     */
    int editGoodsStock(StockEditParamDto stockEditParam);
}
